home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / plan / src / monmenu.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  11KB  |  331 lines

  1. /*
  2.  * Create the widgets for a month calendar in the mainwindow. This code is
  3.  * separate from calmenu.c because other views can also draw into mainwindow.
  4.  * The calendar itself is drawn using Xlib calls. Attempts to do that with
  5.  * Motif were spectacularly slow.
  6.  *
  7.  *    destroy_month_view()        Destroy month view, to make room for
  8.  *                    another view in the mainwindow
  9.  *    create_month_menu(parent)    Create a form widget for the month
  10.  *                    view, and everything in it.
  11.  */
  12.  
  13. #ifndef MIPS
  14. #include <stdlib.h>
  15. #endif
  16. #include <stdio.h>
  17. #include <time.h>
  18. #include <varargs.h>
  19. #include <Xm/Xm.h>
  20. #include <Xm/MainW.h>
  21. #include <Xm/Form.h>
  22. #include <Xm/Frame.h>
  23. #include <Xm/RowColumn.h>
  24. #include <Xm/LabelP.h>
  25. #include <Xm/ArrowBP.h>
  26. #include <Xm/ArrowBG.h>
  27. #include <Xm/PushBP.h>
  28. #include <Xm/PushBG.h>
  29. #include <Xm/Text.h>
  30. #include <Xm/ScrolledW.h>
  31. #include <Xm/DrawingA.h>
  32. #include "cal.h"
  33.  
  34. static void calendar_callback(),
  35.         month_down(), month_up(), year_down(), year_up();
  36. extern void help_callback();
  37. extern time_t get_time();
  38.  
  39. extern Display        *display;    /* everybody uses the same server */
  40. extern GC        gc;        /* everybody uses this context */
  41. extern struct mainmenu    mainmenu;    /* all important main window widgets */
  42. extern struct config    config;        /* global configuration data */
  43. extern Pixel        color[NCOLS];    /* colors: COL_* */
  44. extern int        curr_month;    /* month being displayed, 0..11 */
  45. extern int        curr_year;    /* year being displayed, since 1900 */
  46. extern Widget        mainwindow;    /* popup menus hang off main window */
  47. static Widget        all;        /* the form that contains everything */
  48. static BOOL        have_view;    /* <all> is a valid widget */
  49.  
  50.  
  51.  
  52.  
  53. /*
  54.  * destroy the month view inside the mainwindow. Clear some widget pointers
  55.  * to prevent print_button() from trying to print into them; for example,
  56.  * the time widget gets the new time printed into it every minute otherwise.
  57.  */
  58.  
  59. destroy_month_view()
  60. {
  61.     if (have_view) {
  62.         XTDESTROYWIDGET(all);
  63.         mainmenu.month    = 0;
  64.         mainmenu.year    = 0;
  65.         mainmenu.time    = 0;
  66.         mainmenu.cal    = 0;
  67.         have_view = FALSE;
  68.     }
  69. }
  70.  
  71.  
  72. /*
  73.  * months are different from other views. Week and year views have two create
  74.  * routines, for "menus" (an X window containing the view) and for just the
  75.  * "view" (relying on someone else to create the window). The latter is used
  76.  * when all views go into the mainwindow, the former is used when every view
  77.  * has its own X window. Only months don't have their own window, they always
  78.  * go into the mainwindow. Thus, we only have create/destroy view routines.
  79.  */
  80.  
  81. create_month_view(parent)
  82.     Widget            parent;
  83. {
  84.     Arg            args[15];
  85.     int            n;
  86.     Widget            arrow, scroll;
  87.     int            sm = config.smallmonth;
  88.  
  89.     all = XtCreateWidget("all", xmFormWidgetClass,
  90.             parent, NULL, 0);
  91.     XtAddCallback(all, XmNhelpCallback, help_callback, (XtPointer)"cal");
  92.  
  93.     n = 0;                            /* year */
  94.     XtSetArg(args[n], XmNarrowDirection,    XmARROW_RIGHT);        n++;
  95.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  96.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  97.     XtSetArg(args[n], XmNtopOffset,        10);            n++;
  98.     XtSetArg(args[n], XmNrightOffset,    5);            n++;
  99.     XtSetArg(args[n], XmNforeground,    color[COL_BACK]);    n++;
  100.     XtSetArg(args[n], XmNshadowThickness,    config.sgimode?2:0);    n++;
  101.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  102.     arrow = XtCreateManagedWidget("nexty", xmArrowButtonWidgetClass,
  103.             all, args, n);
  104.     XtAddCallback(arrow, XmNactivateCallback, year_up, (XtPointer)0);
  105.     XtAddCallback(arrow, XmNhelpCallback, help_callback,
  106.                             (XtPointer)"cal_year");
  107.  
  108.     n = 0;
  109.     XtSetArg(args[n], XmNarrowDirection,    XmARROW_LEFT);        n++;
  110.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  111.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_WIDGET);    n++;
  112.     XtSetArg(args[n], XmNrightWidget,    arrow);            n++;
  113.     XtSetArg(args[n], XmNtopOffset,        10);            n++;
  114.     XtSetArg(args[n], XmNrightOffset,    5);            n++;
  115.     XtSetArg(args[n], XmNshadowThickness,    config.sgimode?2:0);    n++;
  116.     XtSetArg(args[n], XmNforeground,    color[COL_BACK]);    n++;
  117.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  118.     arrow = XtCreateManagedWidget("prevy", xmArrowButtonWidgetClass,
  119.             all, args, n);
  120.     XtAddCallback(arrow, XmNactivateCallback, year_down, (XtPointer)0);
  121.     XtAddCallback(arrow, XmNhelpCallback, help_callback,
  122.                             (XtPointer)"cal_year");
  123.  
  124.     n = 0;
  125.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  126.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_WIDGET);    n++;
  127.     XtSetArg(args[n], XmNrightWidget,    arrow);            n++;
  128.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  129.     XtSetArg(args[n], XmNrightOffset,    4);            n++;
  130.     mainmenu.year = XtCreateManagedWidget("year", xmLabelWidgetClass,
  131.             all, args, n);
  132.     XtAddCallback(mainmenu.year, XmNhelpCallback, help_callback,
  133.                         (XtPointer)"cal_year");
  134.  
  135.     n = 0;                            /* month */
  136.     XtSetArg(args[n], XmNarrowDirection,    XmARROW_RIGHT);        n++;
  137.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  138.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_WIDGET);    n++;
  139.     XtSetArg(args[n], XmNrightWidget,    mainmenu.year);        n++;
  140.     XtSetArg(args[n], XmNtopOffset,        10);            n++;
  141.     XtSetArg(args[n], XmNrightOffset,    5);            n++;
  142.     XtSetArg(args[n], XmNforeground,    color[COL_BACK]);    n++;
  143.     XtSetArg(args[n], XmNshadowThickness,    config.sgimode?2:0);    n++;
  144.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  145.     arrow = XtCreateManagedWidget("nextm", xmArrowButtonWidgetClass,
  146.             all, args, n);
  147.     XtAddCallback(arrow, XmNactivateCallback, month_up, (XtPointer)0);
  148.     XtAddCallback(arrow, XmNhelpCallback, help_callback,
  149.                         (XtPointer)"cal_month");
  150.  
  151.     n = 0;
  152.     XtSetArg(args[n], XmNarrowDirection,    XmARROW_LEFT);        n++;
  153.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  154.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_WIDGET);    n++;
  155.     XtSetArg(args[n], XmNrightWidget,    arrow);            n++;
  156.     XtSetArg(args[n], XmNtopOffset,        10);            n++;
  157.     XtSetArg(args[n], XmNrightOffset,    5);            n++;
  158.     XtSetArg(args[n], XmNforeground,    color[COL_BACK]);    n++;
  159.     XtSetArg(args[n], XmNshadowThickness,    config.sgimode?2:0);    n++;
  160.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  161.     arrow = XtCreateManagedWidget("prevm", xmArrowButtonWidgetClass,
  162.             all, args, n);
  163.     XtAddCallback(arrow, XmNactivateCallback, month_down, (XtPointer)0);
  164.     XtAddCallback(arrow, XmNhelpCallback, help_callback,
  165.                         (XtPointer)"cal_month");
  166.  
  167.     n = 0;
  168.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  169.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_WIDGET);    n++;
  170.     XtSetArg(args[n], XmNrightWidget,    arrow);            n++;
  171.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  172.     XtSetArg(args[n], XmNrightOffset,    5);            n++;
  173.     mainmenu.month = XtCreateManagedWidget("month", xmLabelWidgetClass,
  174.             all, args, n);
  175.     XtAddCallback(mainmenu.month, XmNhelpCallback, help_callback,
  176.                         (XtPointer)"cal_month");
  177.  
  178.                                 /* time */
  179.     n = 0;
  180.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  181.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  182.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  183.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  184.     mainmenu.time = XtCreateManagedWidget("time", xmLabelWidgetClass,
  185.             all, args, n);
  186.     if (sm)
  187.         print_button(mainmenu.time,
  188.                 mktimestring(get_time(), FALSE));
  189.     else
  190.         print_button(mainmenu.time, "%s   %s",
  191.                 mkdatestring(get_time(), FALSE),
  192.                 mktimestring(get_time(), FALSE));
  193.  
  194.     n = 0;                            /* calendar */
  195.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  196.     XtSetArg(args[n], XmNtopWidget,        mainmenu.month);    n++;
  197.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  198.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  199.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  200.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  201.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  202.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  203.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  204.     XtSetArg(args[n], XmNwidth,        2*config.calbox_marg[sm]  +
  205.                         1*config.calbox_arrow[sm] +
  206.                         7*config.calbox_xs[sm]    +
  207.                          (config.sgimode?6:4));    n++;
  208.     XtSetArg(args[n], XmNheight,        2*config.calbox_marg[sm]  +
  209.                         1*config.calbox_title[sm] +
  210.                         6*config.calbox_ys[sm]    +
  211.                          (config.sgimode?6:4));    n++;
  212.     XtSetArg(args[n], XmNscrollingPolicy,    XmAUTOMATIC);        n++;
  213.     scroll = XtCreateWidget("scroll", xmScrolledWindowWidgetClass,
  214.             all, args, n);
  215.  
  216.     n = 0;
  217.     XtSetArg(args[n], XmNwidth,        2*config.calbox_marg[sm]  +
  218.                         1*config.calbox_arrow[sm] +
  219.                         7*config.calbox_xs[sm]);    n++;
  220.     XtSetArg(args[n], XmNheight,        2*config.calbox_marg[sm]  +
  221.                         1*config.calbox_title[sm] +
  222.                         6*config.calbox_ys[sm]);    n++;
  223.     mainmenu.cal = XtCreateWidget("cal", xmDrawingAreaWidgetClass,
  224.             scroll, args, n);
  225.     XtAddCallback(mainmenu.cal, XmNinputCallback,  calendar_callback,
  226.                             (XtPointer)NULL);
  227.     XtAddCallback(mainmenu.cal, XmNexposeCallback, calendar_callback,
  228.                             (XtPointer)NULL);
  229.     XtAddCallback(mainmenu.cal, XmNhelpCallback,   help_callback,
  230.                             (XtPointer)"cal");
  231.  
  232.     XtManageChild(mainmenu.cal);
  233.     XtManageChild(scroll);
  234.     XtManageChild(all);
  235.  
  236.     draw_month_year();    /* fill in current month and year */
  237.  
  238.     have_view = TRUE;
  239. }
  240.  
  241.  
  242. /*-------------------------------------------------- callbacks --------------*/
  243. /*
  244.  * the previous or next month or year arrow button was pressed. Switch the
  245.  * calendar, and make sure we stay in the range 1900..2037. All of these
  246.  * routines are direct X callbacks.
  247.  */
  248.  
  249. /*ARGSUSED*/
  250. static void month_down(widget, item, data)
  251.     Widget                widget;
  252.     int                item;
  253.     XmToggleButtonCallbackStruct    *data;
  254. {
  255.     if (curr_month <= 0) {
  256.         if (curr_year <= 0)
  257.             return;
  258.         curr_month = 12;
  259.         curr_year--;
  260.     }
  261.     curr_month--;
  262.     draw_month_year();
  263.     draw_calendar();
  264.     if (curr_month == 11)
  265.         draw_year_calendar();
  266. }
  267.  
  268. /*ARGSUSED*/
  269. static void month_up(widget, item, data)
  270.     Widget                widget;
  271.     int                item;
  272.     XmToggleButtonCallbackStruct    *data;
  273. {
  274.     if (curr_month >= 11) {
  275.         if (curr_year >= 2037)
  276.             return;
  277.         curr_month = -1;
  278.         curr_year++;
  279.     }
  280.     curr_month++;
  281.     draw_month_year();
  282.     draw_calendar();
  283.     if (curr_month == 0)
  284.         draw_year_calendar();
  285. }
  286.  
  287. /*ARGSUSED*/
  288. static void year_down(widget, item, data)
  289.     Widget                widget;
  290.     int                item;
  291.     XmToggleButtonCallbackStruct    *data;
  292. {
  293.     if (curr_year <= 0)
  294.         return;
  295.     curr_year--;
  296.     draw_month_year();
  297.     draw_calendar();
  298.     draw_year_calendar();
  299. }
  300.  
  301. /*ARGSUSED*/
  302. static void year_up(widget, item, data)
  303.     Widget                widget;
  304.     int                item;
  305.     XmToggleButtonCallbackStruct    *data;
  306. {
  307.     if (curr_year >= 2037)
  308.         return;
  309.     curr_year++;
  310.     draw_month_year();
  311.     draw_calendar();
  312.     draw_year_calendar();
  313. }
  314.  
  315. /*ARGSUSED*/
  316. static void calendar_callback(w, data, info)
  317.     Widget                w;
  318.     XtPointer            data;
  319.     XmDrawingAreaCallbackStruct    *info;
  320. {
  321.     if (info->reason == XmCR_INPUT && info->event->xany.type == ButtonPress)
  322.         clicked_calendar(info->event->xbutton.x,
  323.                  info->event->xbutton.y);
  324.     else if (info->reason == XmCR_EXPOSE) {
  325.         XEvent dummy;
  326.         while (XCheckWindowEvent(display, info->window, ExposureMask,
  327.                                 &dummy));
  328.         draw_calendar();
  329.     }
  330. }
  331.